return {
    "williamboman/mason.nvim",
    event = "VeryLazy",
    dependencies = {
        "neovim/nvim-lspconfig",
        "williamboman/mason-lspconfig.nvim",
    },
    opts = {},
    config = function(_, opts)
        require("mason").setup(opts)
        local registry = require "mason-registry"
        --
        -- -- 以 lua 为例，我们在 mason 中查找得到其 lsp 的名字是 lua-language-server
        -- --
        -- -- 这里的 pcall 类似于其他语言的 try...catch...
        -- -- 我们这里判断该 lsp 是否存在，因为有可能我们的 registry 并没有正常被下载，而且也可以防止我们写错 lsp 名字
        -- -- 还要判断一下这个 lsp 是否已经被安装，避免重复安装
        -- --
        -- -- 注意这里 package 后面跟的是 `:`，我们在前面的教程中提到过
        -- -- registry.get_package("lua-language-server")
        -- local success, package = pcall(registry.get_package, "lua-language-server")
        -- if success and not package:is_installed() then
        --     package:install()
        -- end
        --
        -- -- neovim/nvim-lspconfig插件的lsp 命名规则和 mason 是不一样的，此处借助"williamboman/mason-lspconfig.nvim"插件进行自动转换
        -- -- mason 中的 lua-language-server 在nvim-lspconfig中叫做 lua_ls
        -- -- 获取 lua-language-server 在 nvim-lspconfig 中的名称
        -- local nvim_lsp = require("mason-lspconfig.mappings.server").package_to_lspconfig["lua-language-server"]
        -- -- require("lspconfig")[nvim_lsp].setup({})
        -- require("lspconfig")[nvim_lsp].setup({
        --     settings = {
        --         Lua = {
        --             diagnostics = {
        --                 globals = { "vim" },
        --             },
        --         },
        --     },
        -- })

        -- setup函数：安装+配置lsp server
        local function setup(name, config)
            local success, package = pcall(registry.get_package, name)
            if success and not package:is_installed() then
                package:install()
            end

            local lsp = require("mason-lspconfig.mappings.server").package_to_lspconfig[name]
            -- 配置支持的capability，告知lsp server
            config.capabilities = require("blink.cmp").get_lsp_capabilities() -- 新添加的内容
            -- 配置的 lsp 不要进行格式化,所有的格式化工作都应该由 none-ls 负责
            config.on_attach = function(client)
                client.server_capabilities.documentFormattingProvider = false
                client.server_capabilities.documentRangeFormattingProvider = false
            end
            require("lspconfig")[lsp].setup(config)
        end

        -- setup("lua-language-server", {
        --     settings = {
        --         Lua = {
        --             diagnostics = {
        --                 globals = { "vim" },
        --             },
        --         }
        --     }
        -- })
        local servers = {
            ["lua-language-server"] = {
                settings = {
                    Lua = {
                        diagnostics = {
                            globals = { "vim" },
                        },
                    }
                }
            },
            pyright = {},
            clangd = {},
            -- ["html-lsp"] = {},
            -- ["css-lsp"] = {},
            -- ["typescript-language-server"] = {},
            -- ["emmet-ls"] = {},
        }

        for server, config in pairs(servers) do
            setup(server, config)
        end
        -- 解决Mason懒加载导致第一个打开的buffer未触发lsp server启动问题
        vim.cmd("LspStart")
        -- 诊断信息显示配置
        vim.diagnostic.config({
            virtual_text = true,
            -- virtual_lines = true,
            update_in_insert = true,
        })
    end
}
